﻿// Example header text. Can be configured in the options.
using System;
using System.Globalization;
using System.Linq;

namespace vtech_frameWorks.Library
{
    public class ClsDateTime
    {
        /// <summary>
        /// Kiểu DateTime
        /// </summary>
        public static DateTime DateTime = new DateTime(0x76c, 1, 1);

        /// <summary>
        /// chuyển đổi định dạng ngày tháng địa phương sang quốc tế
        /// </summary>
        /// <param name="strLocalDate"></param>
        /// <returns></returns>
        #region Date Time
        public static DateTime ConvertLocaltoGlobalDateTime(string strLocalDate)
        {
            try
            {
                CultureInfo MyCultureInfo = new CultureInfo(ClsUtilities.GetConfigKey("CultureInfo"));
                DateTime date = DateTime.Parse(strLocalDate, MyCultureInfo);
                return date;
            }
            catch
            {
                //return Convert.ToDateTime(strLocalDate);
                return DateTime;
            }
        }

        public static DateTime ConvertLocaltoGlobalDateTime(string strLocalDate, DateTime defaultLocalDate)
        {
            try
            {
                CultureInfo MyCultureInfo = new CultureInfo(ClsUtilities.GetConfigKey("CultureInfo"));
                DateTime date = DateTime.Parse(strLocalDate, MyCultureInfo);
                return date;
            }
            catch
            {
                return defaultLocalDate;
            }
        }

        /// <summary>
        /// Lấy giá trị ngày tháng hiện tại
        /// </summary>
        /// <returns></returns>
        public static DateTime GetDateNow()
        {
            return ConvertLocaltoGlobalDateTime(DateTime.Now.ToShortDateString());
        }

        /// <summary>
        /// Lấy giá trị ngày tháng nhỏ nhất
        /// </summary>
        /// <returns></returns>
        public static DateTime GetMinDate()
        {
            return ConvertLocaltoGlobalDateTime(ClsUtilities.GetConfigKey(ClsConstants.ConfigKey.MinDate));
        }

        /// <summary>
        /// Chỉ hiển thị ngày tháng
        /// </summary>
        /// <param name="d">ngày tháng</param>
        /// <returns></returns>
        public static string FormatDisplayDateOnly(DateTime d)
        {
            if (ClsObject.IsNullOrEmpty(d))
            {
                return string.Empty;
            }
            string result = string.Empty;
            try
            {
                result = d.ToString(ClsUtilities.GetConfigKey(ClsConstants.ConfigKey.DisplayDateFormat));
            }
            catch
            {
                result = string.Empty;
            }
            finally
            {
                if (d.Equals(DateTime.MinValue))
                {
                    result = string.Empty;
                }
                else
                {
                    result = result.Equals(ClsUtilities.GetConfigKey(ClsConstants.ConfigKey.MinDate)) ? null : result;
                }
            }
            return result;
        }

        /// <summary>
        /// Hiển thị ngày tháng và giờ
        /// </summary>
        /// <param name="d"></param>
        /// <returns></returns>
        public static string FormatDisplayDateTime(DateTime d)
        {
            if (ClsObject.IsNullOrEmpty(d))
            {
                return string.Empty;
            }
            string result = string.Empty;
            try
            {
                result = d.ToString(ClsUtilities.GetConfigKey(ClsConstants.ConfigKey.DisplayDateTimeFormat));
            }
            catch
            {
                result = string.Empty;
            }
            finally
            {
                if (d.Equals(DateTime.MinValue))
                {
                    result = string.Empty;
                }
                else
                {
                    result = result.Equals(ClsUtilities.GetConfigKey(ClsConstants.ConfigKey.MinDate)) ? null : result;
                }
            }
            return result;
        }

        /// <summary>
        /// Lấy ngày đầu tiên của tuần
        /// </summary>
        /// <param name="date">ngày tháng</param>
        /// <returns></returns>
        public static DateTime GetFirstDayOfWeek(DateTime date)
        {
            return date.AddDays(1 - (int)date.DayOfWeek);
        }

        /// <summary>
        /// Lấy ngày đầu tiên của tuần hiện tại
        /// </summary>
        /// <returns></returns>
        public static DateTime GetFirstDayOfWeek()
        {
            return GetFirstDayOfWeek(DateTime.Now);
        }

        /// <summary>
        /// Ngày đầu tiên của tháng
        /// </summary>
        /// <param name="date">ngày tháng</param>
        /// <returns></returns>
        public static DateTime GetFirstDayOfMonth(DateTime date)
        {
            return date.AddDays(1 - date.Day);
        }

        /// <summary>
        /// Ngày đầu tiên của tháng hiện tại
        /// </summary>
        /// <returns></returns>
        public static DateTime GetFirstDayOfMonth()
        {
            return GetFirstDayOfMonth(DateTime.Now);
        }

        public static DateTime GetFirstDayOfQuarter(DateTime date)
        {
            while (date.Month % 3 != 1)
            {
                date = date.AddMonths(-1);
            }
            return date.AddDays(1 - date.Day);
        }

        public static DateTime GetFirstDayOfQuarter()
        {
            return GetFirstDayOfQuarter(DateTime.Now);
        }

        public static DateTime GetFirstDayOfYear(DateTime date)
        {
            return date.AddDays(1 - date.DayOfYear);
        }

        /// <summary>
        /// Lấy ngày đầu tiên của năm
        /// </summary>
        /// <returns></returns>
        public static DateTime GetFirstDayOfYear()
        {
            return GetFirstDayOfYear(DateTime.Now);
        }

        public static DateTime GetLastDayOfWeek(DateTime date)
        {
            return date.AddDays(7 - (int)date.DayOfWeek);
        }

        public static DateTime GetLastDayOfWeek()
        {
            return GetLastDayOfWeek(DateTime.Now);
        }

        public static DateTime GetLastDayOfMonth(DateTime date)
        {
            date = date.AddMonths(1);
            return date.AddDays(0 - date.Day);
        }

        public static DateTime GetLastDayOfMonth()
        {
            return GetLastDayOfMonth(DateTime.Now);
        }

        public static DateTime GetLastDayOfQuarter(DateTime date)
        {
            while (date.Month % 3 != 0)
            {
                date = date.AddMonths(1);
            }
            date = date.AddMonths(1);
            return date.AddDays(0 - date.Day);
        }

        public static DateTime GetLastDayOfQuarter()
        {
            return GetLastDayOfQuarter(DateTime.Now);
        }

        public static DateTime GetLastDayOfYear(DateTime date)
        {
            date = date.AddYears(1);
            return date.AddDays(0 - date.DayOfYear);
        }

        public static DateTime GetLastDayOfYear()
        {
            return GetLastDayOfYear(DateTime.Now);
        }
        #endregion
    }
}